package com.ruoyi.purchase.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 订单编号生成工具类
 * 
 * @author ruoyi
 */
public class OrderCodeGenerator {
    
    // 使用AtomicInteger保证线程安全
    private static AtomicInteger purchaseSequence = new AtomicInteger(1);
    private static AtomicInteger salesSequence = new AtomicInteger(1);
    
    // 最大序列号（每天从1开始计数）
    private static final int MAX_SEQUENCE = 9999;
    
    // 上一次生成的日期
    private static String lastPurchaseDate = null;
    private static String lastSalesDate = null;
    
    // 随机数生成器
    private static Random random = new Random();
    
    /**
     * 生成采购订单编号
     * 格式：PO + 年月日 + 4位序列号 + 2位随机数（如：PO2025062300001XX）
     * 
     * @return 订单编号
     */
    public synchronized static String generateOrderCode() {
        // 获取当前日期
        String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
        
        // 如果日期变化，重置序列号
        if (lastPurchaseDate == null || !lastPurchaseDate.equals(currentDate)) {
            purchaseSequence.set(1);
            lastPurchaseDate = currentDate;
        }
        
        // 获取当前序列号
        int currentSequence = purchaseSequence.getAndIncrement();
        if (currentSequence > MAX_SEQUENCE) {
            currentSequence = 1;
            purchaseSequence.set(2);
        }
        
        // 生成两位随机数
        int randomNum = random.nextInt(100);
        
        // 构建订单编号：PO + 年月日 + 4位序列号（补0）+ 2位随机数（补0）
        return String.format("PO%s%04d%02d", currentDate, currentSequence, randomNum);
    }
    
    /**
     * 生成销售订单编号
     * 格式：SO + 年月日 + 4位序列号 + 2位随机数（如：SO2025062300001XX）
     * 
     * @return 订单编号
     */
    public synchronized static String generateSalesOrderCode() {
        // 获取当前日期
        String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
        
        // 如果日期变化，重置序列号
        if (lastSalesDate == null || !lastSalesDate.equals(currentDate)) {
            salesSequence.set(1);
            lastSalesDate = currentDate;
        }
        
        // 获取当前序列号
        int currentSequence = salesSequence.getAndIncrement();
        if (currentSequence > MAX_SEQUENCE) {
            currentSequence = 1;
            salesSequence.set(2);
        }
        
        // 生成两位随机数
        int randomNum = random.nextInt(100);
        
        // 构建订单编号：SO + 年月日 + 4位序列号（补0）+ 2位随机数（补0）
        return String.format("SO%s%04d%02d", currentDate, currentSequence, randomNum);
    }
} 